home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 25 / AACD 25.iso / AACD / Magazine / Online / QMail / source / substdo.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-15  |  2.0 KB  |  109 lines

  1. #include "substdio.h"
  2. #include "str.h"
  3. #include "byte.h"
  4. #include "error.h"
  5.  
  6. static int allwrite(op,fd,buf,len)
  7. register int (*op)();
  8. register int fd;
  9. register char *buf;
  10. register int len;
  11. {
  12.   register int w;
  13.  
  14.   while (len) {
  15.     w = op(fd,buf,len);
  16.     if (w == -1) {
  17.       if (errno == error_intr) continue;
  18.       return -1; /* note that some data may have been written */
  19.     }
  20.     if (w == 0) ; /* luser's fault */
  21.     buf += w;
  22.     len -= w;
  23.   }
  24.   return 0;
  25. }
  26.  
  27. int substdio_flush(s)
  28. register substdio *s;
  29. {
  30.   register int p;
  31.  
  32.   p = s->p;
  33.   if (!p) return 0;
  34.   s->p = 0;
  35.   return allwrite(s->op,s->fd,s->x,p);
  36. }
  37.  
  38. int substdio_bput(s,buf,len)
  39. register substdio *s;
  40. register char *buf;
  41. register int len;
  42. {
  43.   register int n;
  44.  
  45.   while (len > (n = s->n - s->p)) {
  46.     byte_copy(s->x + s->p,n,buf); s->p += n; buf += n; len -= n;
  47.     if (substdio_flush(s) == -1) return -1;
  48.   }
  49.   /* now len <= s->n - s->p */
  50.   byte_copy(s->x + s->p,len,buf);
  51.   s->p += len;
  52.   return 0;
  53. }
  54.  
  55. int substdio_put(s,buf,len)
  56. register substdio *s;
  57. register char *buf;
  58. register int len;
  59. {
  60.   register int n;
  61.  
  62.   n = s->n;
  63.   if (len > n - s->p) {
  64.     if (substdio_flush(s) == -1) return -1;
  65.     /* now s->p == 0 */
  66.     if (n < SUBSTDIO_OUTSIZE) n = SUBSTDIO_OUTSIZE;
  67.     while (len > s->n) {
  68.       if (n > len) n = len;
  69.       if (allwrite(s->op,s->fd,buf,n) == -1) return -1;
  70.       buf += n;
  71.       len -= n;
  72.     }
  73.   }
  74.   /* now len <= s->n - s->p */
  75.   byte_copy(s->x + s->p,len,buf);
  76.   s->p += len;
  77.   return 0;
  78. }
  79.  
  80. int substdio_putflush(s,buf,len)
  81. register substdio *s;
  82. register char *buf;
  83. register int len;
  84. {
  85.   if (substdio_flush(s) == -1) return -1;
  86.   return allwrite(s->op,s->fd,buf,len);
  87. }
  88.  
  89. int substdio_bputs(s,buf)
  90. register substdio *s;
  91. register char *buf;
  92. {
  93.   return substdio_bput(s,buf,str_len(buf));
  94. }
  95.  
  96. int substdio_puts(s,buf)
  97. register substdio *s;
  98. register char *buf;
  99. {
  100.   return substdio_put(s,buf,str_len(buf));
  101. }
  102.  
  103. int substdio_putsflush(s,buf)
  104. register substdio *s;
  105. register char *buf;
  106. {
  107.   return substdio_putflush(s,buf,str_len(buf));
  108. }
  109.